/*
 Problem Description
在网络课程上，我学到了很多有关IP的知识。IP全称叫网际协议，有时我们又用IP来指代我们的IP网络地址，
现在IPV4下用一个32位无符号整数来表示，一般用点分方式来显示，点将IP地址分成4个部分，每个部分为8位，
表示成一个无符号整数（因此不需要用正号出现），如192.168.100.16，是我们非常熟悉的IP地址，
一个IP地址串中没有空格出现（因为要表示成一个32数字）。
但是粗心的我，常常将IP地址写错，现在需要你用程序来判断。
Input
输入有多个case，每个case有一行，不超过100个字符。
Output
对于每个case，判断输入的IP是否正确，如果正确输入YES，否则NO。
Sample Input
192.168.100.16
Sample Output
YES
 */
package com.yuan.algorithms.practice201504;

import java.util.Scanner;

public class 判断IP的正确性 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			String ip = sc.nextLine();
			if (f(ip)) {
				System.out.println("YES");
			}else {
				System.out.println("NO");
			}
		}

	}

	private static boolean f(String ip) {
		if (ip.length() > 15) {
			return false;
		} else {
			int[] num = new int[4];
			String[] a1 = new String[4];
			for (int i = 0; i < a1.length; i++) {
				a1[i] = "";
			}
			//判断字符的有效性
			for (int i = 0,s=0; i < ip.length(); i++) {
				if (ip.charAt(i) != '.' && (ip.charAt(i)-'0'<0 || ip.charAt(i)-'0'>9)) {
					return false;
				}else if (ip.charAt(i)=='.') {
					s++;
					if (s>3) {
						return false;
					}
				}
			}
			for (int i = 0, k = 0; i < ip.length() && k < 4; i++) {
				if (ip.charAt(i) != '.') {
					a1[k] += ip.charAt(i);
					if (a1[k].length()>3) {
						return  false;
					}
				} else {
					k++;
				}
			}
			for (int i = 0; i < a1.length; i++) {
				try {
					num[i] = Integer.parseInt(a1[i]);
				} catch (Exception e) {
					return false;
				}
			}
			for (int i = 0; i < num.length; i++) {
				if (num[i]<0||num[i]>255) {
					return false;
				}
			}
			return true;
		}
	}

}
